/** Request 网络请求工具 更详细的 api 文档: https://github.com/umijs/umi-request */
import { extend } from "umi-request";
import { notification } from "antd";
import StorageManager from "@/utils/StorageManager";
export const BASE_URL = "http://localhost:5005";

export type TError = {
  response: {
    status?: number;
    statusText?: string;
    message?: string;
    error?: number;
    error_description?: string;
    error_message?: string;
  };
};

export type TResult<T> = {
  data: T | null;
  code: number;
  message: string;
  msg: string;
  Disposition?: string;
};

const codeMessage = {
  200: "服务器成功返回请求的数据。",
  201: "新建或修改数据成功。",
  202: "一个请求已经进入后台排队（异步任务）。",
  204: "删除数据成功。",
  400: "发出的请求有错误，服务器没有进行新建或修改数据的操作。",
  401: "用户没有权限（令牌、用户名、密码错误）。",
  403: "用户得到授权，但是访问是被禁止的。",
  404: "发出的请求针对的是不存在的记录，服务器没有进行操作。",
  406: "请求的格式不可得。",
  410: "请求的资源被永久删除，且不会再得到的。",
  422: "当创建一个对象时，发生一个验证错误。",
  500: "服务器发生错误，请检查服务器。",
  502: "网关错误。",
  503: "服务不可用，服务器暂时过载或维护。",
  504: "网关超时。",
};

/** 异常处理程序 */
const errorHandler = (error: TError) => {
  let { response } = error;
  if (response && response.status) {
    // @ts-ignore
    const errorText = codeMessage[response.status] || response.statusText;
    response.error = response.status;
    response.error_description = errorText;
    response.error_message = response.message;
  } else if (!response) {
    response = {
      error: -1,
      error_description: "您的网络发生异常，无法连接服务器",
    };
  }

  return response;
};
/** 配置request请求时的默认参数 */

const requestExtend = extend({
  // suffix: ".json",
  errorHandler,
  // 默认错误处理
  // credentials: 'include', // 默认请求是否带上cookie
});

const checkOptions = (opt: Record<string, any>) => {
  const options = { ...opt };
  // trimOptions(options.data);
  if (opt.method.toLowerCase() === "get") {
    const { data, ...rest } = options;
    return {
      ...rest,
      params: data,
    };
  }
  return options;
};

const request = async <T>(url: string, opt = {}) => {
  const options = checkOptions(opt);
  const {
    headers = {},
    showError = true,
    useCrmToken = false,
    ...rest
  } = options;

  const token = StorageManager.getSessionStorageSimpleSync("storage-token");
  const Authorization = token ? `Bearer ${token}` : "";
  const res = await requestExtend(url, {
    prefix: `${BASE_URL}`,
    headers: {
      Accept: "*/*",
      "Content-Type": "application/json",
      "Cache-Control": "no-cache",
      Authorization: Authorization,
      ...headers,
    },
    method: "get",
    timeout: 30000,
    ...rest,
    // data: {
    //   params: JSON.stringify({ ...rest.data }),
    //   timestamp: Date.now(),
    //   token: token,
    // },
    data: rest.data,
  });

  console.log("res===res", res);
  return res;
};
export default request;
